iT邦幫忙

2024 iThome 鐵人賽

DAY 28
0
DevOps

《30天挑戰精通 PowerShell:從 Windows Server 到 Azure DevOps 自動化之旅》系列 第 28

Day 28 - 將 CI/CD 流程透過 Azure DevOps 去執行吧 - Part 2

  • 分享至 

  • xImage
  •  

昨天我們已將 Vue 專案推送至 Azure Repo,今天將介紹 Azure Agent 的配置以及建立 Pipeline 的初期設定。內容位於昨日提到的流程步驟 2 到 3 之間的預先配置。以下是今天的主要步驟:

  1. 建立 PAT
  2. 新增 Agent Pool 及 Agent
  3. 在 Windows 安裝並啟用 SSH
  4. 在 Linux 安裝並啟用 PowerShell

概念圖

今天的重點集中在下圖中的紅框部分。當 Azure DevOps 需要進行集成(CI)和部署(CD)時,會透過 Agent 來執行具體任務。我今天會使用 Linux 作為 Agent,因此 CI 及 CD 的 Tasks 都會透過該 Agent 來進行操作。在 CI 階段,我們將建立好的靜態資源推送到 Azure Pipeline Artifact;在 CD 階段,我們會將 Artifact 下載到 Windows Server,並透過 PowerShell 進行部署。Azure Pipeline 的 Agent Job 會透過 Agent Pool 決定使用哪一個 Agent 來執行任務。
https://ithelp.ithome.com.tw/upload/images/20241012/201687087gLZq0M7Wk.png


建立 PAT ( Personal Access Token )

在 Linux 安裝 Agent 之前,需要先建立一個 PAT,並在運行安裝檔時輸入。

點選 User Settings(位於畫面右上角的人物加齒輪圖示),選擇「Personal access tokens 」。
https://ithelp.ithome.com.tw/upload/images/20241012/201687084eWO0CT0ru.png

點選右上角的 New Token。
https://ithelp.ithome.com.tw/upload/images/20241012/201687083xagS92jmj.png

在浮動視窗 Create a new personal access token 裡,輸入 Token 名稱,將 scope 設定為 Full access 後,點擊 Create 按鍵。
https://ithelp.ithome.com.tw/upload/images/20241012/20168708qiwQUCtJHY.png

妥善保存顯示的 Token,這個 Token 只會顯示一次,關閉畫面後若未保存,只能重新生成。
https://ithelp.ithome.com.tw/upload/images/20241012/201687082rjBMzG1hM.png

確認剛剛建立的 Token 在列表中,且其狀態為 Active。
https://ithelp.ithome.com.tw/upload/images/20241012/20168708Y59fNBhDuf.png


在 Azure DevOps 建立 Agent Pool

在 Azure DevOps 的 Project settings 預設會有兩個 Agent Pool,但這次我們將使用自托管的 Linux Server,因此點擊截圖中的 Add pool 藍色按鈕,開啟 Add agent pool 的浮動視窗。
https://ithelp.ithome.com.tw/upload/images/20241012/20168708XG2Oup4cvv.png

在 Pool type 的下拉式選單中選擇 Self-hosted,並為其命名。
https://ithelp.ithome.com.tw/upload/images/20241012/20168708BbL35rvukx.png

在 Agent pool name 欄位填入名稱,並勾選 Grant access permission to all pipelines,以便專案內所有 Pipeline 都能自動使用此代理池(Agent Pool),無需逐一設定權限。
https://ithelp.ithome.com.tw/upload/images/20241012/20168708qAPBjqRwRX.png


為 Agent Pool 新增成員

建立 Pool 後,點擊剛剛建立的 Pool 進行進一步的設定。
https://ithelp.ithome.com.tw/upload/images/20241012/20168708wWmmEW0VbZ.png

在 Pool 設定頁面,點擊右上角的 New agent 按鈕。
https://ithelp.ithome.com.tw/upload/images/20241012/201687083u6kwswFUO.png

在 Get the agent 彈跳視窗中,點擊 Linux 的子頁面,並依循指令在 Linux 上安裝 Agent。
https://ithelp.ithome.com.tw/upload/images/20241012/20168708LOXZuApUYj.png

到 Linux Server 安裝 Agent

Download the agent

mkdir Downloads
curl https://vstsagentpackage.azureedge.net/agent/3.245.0/vsts-agent-linux-x64-3.245.0.tar.gz --output Downloads/vsts-agent-linux-x64-3.245.0.tar.gz

Create the agent folder and unzip it

mkdir myagent && cd myagent
tar zxvf ~/Downloads/vsts-agent-linux-x64-3.245.0.tar.gz

完成後可以使用 ls -lt 指令確認檔案已正確解壓縮。
https://ithelp.ithome.com.tw/upload/images/20241012/20168708gXMrz1WmxY.png

Configure the agent

./config.sh

運行配置腳本,依提示操作,包含輸入 Server URL 及 PAT 等資訊。
https://ithelp.ithome.com.tw/upload/images/20241012/20168708Uw6MYJ0uxB.png

完成後,可以到 Agent Pool 查看其成員( ServerA )是否已經加入 Pool,的確是看到了,但是卻是顯示 Offline(紅燈)。
https://ithelp.ithome.com.tw/upload/images/20241012/20168708blEtN4bYau.png

查看了兩篇文章,似乎跟權限有關,我才想起來我在安裝時,並沒有使用到 sudo,兩篇文章都提到了下面的指令,我決定參考 stackoverflow 這篇
但是在執行之前,還是看一下該 script 內容才是最保險的:

function start()
{
    systemctl start ${SVC_NAME} || failed "failed to start ${SVC_NAME}"
    status
}

看來是要透過 systemctl 去將服務帶起來,可以安心執行了。

sudo ./svc.sh start 

結果直接跑失敗,顯示沒有該 service,試試先 install:
https://ithelp.ithome.com.tw/upload/images/20241012/20168708bbrX5KY4sQ.png

再次回頭看 Agent 的狀態,轉變成 Online ( 綠燈 )了。
https://ithelp.ithome.com.tw/upload/images/20241012/20168708lvfEsj4fg1.png


預先設定:為 Windows Server 開啟 SSH Port

到 Windows Server 上設定

下載 OpenSSH 壓縮檔

https://github.com/PowerShell/Win32-OpenSSH/releases

選擇 OpenSSH-Win64.zip。
https://ithelp.ithome.com.tw/upload/images/20241012/20168708QXjB9QiROC.png

解壓縮到指定位置,將下載的 ZIP 文件解壓縮到 C:\Program Files\OpenSSH(或你也可以選擇其他目錄,但建議使用此路徑)。
https://ithelp.ithome.com.tw/upload/images/20241012/20168708QiiS8OZXz9.png

透過 PowerShell 在對應的資料夾安裝 OpenSSH

.\install-sshd.ps1

https://ithelp.ithome.com.tw/upload/images/20241012/20168708WMHKNriSqf.png

設定開機自動帶起 sshd 跟 ssh-agent,並將 service 啟用

Set-Service sshd -StartupType Automatic
Set-Service ssh-agent -StartupType Automatic
Start-Service sshd
Start-Service ssh-agent

https://ithelp.ithome.com.tw/upload/images/20241012/20168708KPuxmfyNtt.png

設定防火牆允許 SSH 連線

New-NetFirewallRule -Name sshd -DisplayName 'OpenSSH SSH Server' -Enabled True `
-Direction Inbound -Protocol TCP -Action Allow -LocalPort 22

https://ithelp.ithome.com.tw/upload/images/20241012/20168708VRSCJXWzW6.png

透過修改 sshd.config 以調整 ssh 設定

C:\ProgramData\ssh\sshd_config 

https://ithelp.ithome.com.tw/upload/images/20241012/201687087yyKBRE0Oc.png

  • 設定允許密碼認證
PasswordAuthentication Yes
  • 允許特定用戶登入
AllowUsers your_username

重啟 ssh service

Restart-Service sshd

透過 agent 那台 linux server 去做 ssh 驗證

ssh your_username@192.168.1.203

預先設定:為 Linux Server 安裝 PowerShell

參考文章:Installing PowerShell on Ubuntu

安裝手順

###################################
# Prerequisites

# Update the list of packages
sudo apt-get update

# Install pre-requisite packages.
sudo apt-get install -y wget apt-transport-https software-properties-common

# Get the version of Ubuntu
source /etc/os-release

# Download the Microsoft repository keys
wget -q https://packages.microsoft.com/config/ubuntu/$VERSION_ID/packages-microsoft-prod.deb

# Register the Microsoft repository keys
sudo dpkg -i packages-microsoft-prod.deb

# Delete the Microsoft repository keys file
rm packages-microsoft-prod.deb

# Update the list of packages after we added packages.microsoft.com
sudo apt-get update

###################################
# Install PowerShell
sudo apt-get install -y powershell

# Start PowerShell
pwsh

明日主題

Day 29 - 將 CI/CD 流程透過 Azure DevOps 去執行吧 - Part 3


上一篇
Day 27 - 將 CI/CD 流程透過 Azure DevOps 去執行吧 - Part 1
下一篇
Day 29 - 將 CI/CD 流程透過 Azure DevOps 去執行吧 - Part 3
系列文
《30天挑戰精通 PowerShell:從 Windows Server 到 Azure DevOps 自動化之旅》30
圖片
  直播研討會
圖片
{{ item.channelVendor }} {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中

尚未有邦友留言

立即登入留言